package Day_0131.JVM;

/**
 * @author zxc
 * @date 2023/01/31 22:11
 **/
public class JVM_garbage_collector {
    public static void main(String[] args) {
        /**
         * 垃圾收集器 ：
         * 1.Serial收集器（复制算法): 新生代单线程收集器;
         * 标记和清理都是单线程，优点是简单高效;
         *
         * 2.ParNew收集器 (复制算法): 新生代收并行集器;
         * 实际上是Serial收集器的多线程版本，在多核CPU环境下有着比Serial更好的表现;
         *
         * 3.Parallel Scavenge收集器 (复制算法): 新生代并行收集器;
         * 追求高吞吐量，高效利用 CPU;
         * 吞吐量 = 用户线程时间/(用户线程时间+GC线程时间);
         * 高吞吐量可以高效率的利用CPU时间，尽快完成程序的运算任务，适合后台应用等对交互相应要求不高的场景;
         *
         * 4.Serial Old收集器 (标记-整理算法):老年代单线程收集器，Serial收集器的老年代版本;
         *
         * 5.Parallel Old收集器 (标记-整理算法) : 老年代并行收集器;
         * 吞吐量优先，Parallel Scavenge收集器的老年代版本;
         *
         * 6.CMS(Concurrent Mark Sweep)收集器（标记-清除算法）： 老年代并行收集器;
         * 以获取最短回收停顿时间为目标的收集器，具有高并发、低停顿的特点，追求最短GC回收停顿时间。
         *
         * 7.G1(Garbage First)收集器 (标记-整理算法)： Java堆并行收集器;
         * G1收集器是JDK1.7提供的一个新收集器，G1收集器基于“标记-整理”算法实现，也就是说不会产生内存碎片。
         * 此外，G1收集器不同于之前的收集器的一个重要特点是 :
         * G1回收的范围是整个Java堆(包括新生代，老年代);
         *
         * 8.ZGC （Z Garbage Collector）是以低延迟为首要目标的一款垃圾收集器;
         * 它是基于动态Region内存布局，（暂时）不设年龄分代，使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记-整理算法的收集器。
         * 主要特点是：回收TB级内存（最大4T），停顿时间不超过10ms。
         * 优点：低停顿，高吞吐量， ZGC 收集过程中额外耗费的内存小。
         * 缺点：浮动垃圾目前使用的非常少，真正普及还是需要写时间的。
         *
         * 新生代收集器：Serial、 ParNew 、 Parallel Scavenge
         * 老年代收集器： CMS 、Serial Old、Parallel Old
         * 整堆收集器： G1 ， ZGC (因为不涉年代不在图中)。
         */

        /**
         * 如何选择垃圾回收器 ？
         * 1. 如果你的堆大小不是很大（比如 100MB ），选择串行收集器一般是效率最高的。
         * 参数： -XX:+UseSerialGC 。
         *
         * 2. 如果你的应用运行在单核的机器上，或者你的虚拟机核数只有单核，选择串行收集器依然是合适的，这时候启用一些并行收集器没有任何收益。
         * 参数： -XX:+UseSerialGC 。
         *
         * 3. 如果你的应用是“吞吐量”优先的，并且对较长时间的停顿没有什么特别的要求。选择并行收集器是比较好的。
         * ===》 即，串行收集器能够极大程度上提高吞吐量，充分利用CPU多核资源；
         * 参数： -XX:+UseParallelGC 。
         *
         * 4. 如果你的应用对响应时间要求较高，想要较少的停顿。甚至 1 秒的停顿都会引起大量的请求失败，
         * 那么选择 G1 、 ZGC 、 CMS 都是合理的。
         * 虽然这些收集器的 GC 停顿通常都比较短，但它需要一些额外的资源去处理这些工作，通常吞吐量会低一些。
         * ===》 为使得响应时间尽可能的短，使用G1,ZGC,CMS垃圾回收器，能够极大程度上降低响应时间;
         * 参数：
         * -XX:+UseConcMarkSweepGC 、
         * -XX:+UseG1GC 、
         * -XX:+UseZGC 等。
         *
         * 从上面这些出发点来看，我们平常的 Web 服务器，都是对响应性要求非常高的。
         * 选择性其实就集中在 CMS 、 G1 、 ZGC 上。
         * 而对于某些定时任务，使用并行收集器，是一个比较好的选择。
         */
    }
}
